一、执行结果及原因：

var a = []
for(var i = 0;i<10;i++){
    a[i] = funciton (){
        console.log(i)
    }
}
a[6]()

执行结果：10
原因：a[6]() 等价于执行一个function(){console.log(i)}。执行过程中通过原型链原理查找i,最终找到i为全局变量。而在执行函数之前，i<10时,每次循环执行了递增，最终为10.所以最终执行结果为打印出10.

二、说出执行结果并解释原因。
var tmp = 123;

if(true){
    console.log(tmp)
    let tmp
}

执行结果：报错：不能在定义前使用变量tmp（cannot access ‘tmp' before initialization)
原因：let块级作用域，不存在变量提升，必须在定义后使用。

三、结合es6新语法，用最简单的方式找到数组中的最小值。

var arr = [12,34,32,89,4]

console.log(Math.min(...arr))

四、说明var、let、const三种声明变量方式之间的差别；

1、var声明的是全局变量；let和const是块级作用域局部变量。
2、let声明不会提升，所以需要在声明后使用。
3、const定义恒量，所以声明时就需要赋值。const声明的变量本身不可修改，即如果const声明的是引用类型，则引用的指针地址不可修改，但其属性值可以备修改。

五、说出输出结果及原因。
var a = 10;
var obj = {
    a:20,
    fn(){
        setTimeout(() => {
            console.log(this.a)
        })
    }
}
obj.fn()

执行结果：20
原因：箭头函数的this始终指向函数被创建的执行上下文，此处也就是fn()函数。该函数自身有2属性值为20,不再通过原型链往上查找，故输出20.

六、简述Symbol类型的用途。

用途：用于为对象添加独一无二的属性标识符，避免冲突。

七、说说什么是浅拷贝，什么是深拷贝？

浅拷贝：直接拷贝栈中的值或者引用地址。所以会影响原对象。
深拷贝：拷贝栈中的值或者地址及堆中存储的对象信息。拷贝对象和原对象相互独立，不影响。

八、简述TypeScript与JavaScript之间的关系。

TypeScript是一门基于JavaScript的编程语言。相比JavaScript多了一些新特性，开发完成之后会变成成可以直接运行的JacaScript代码。可以提高编码效率和可靠程度。任何JavaScript运行环境都支持TypeScript,所以相比于ES6有些新特性，兼容性更好。

九、TypeScript优缺点。

优点：
1、js文件可以直接编译成js文件，兼容性强；
2、强类型一定程度地增强了可读性和可维护性；
3、完全支持ES6，且能在所有JavaScript运行环境运行，相比ES6更方便。

缺点：
1、有一些新概念，比如接口、泛型、类和枚举类型，需要一定的学习成本；
2、需要增加类型定义，虽然减少了维护成本，但对于短期开发来说，增加了开发成本；
3、TS集成到构建流程需要一定的工作量；
4、和有些库结合时不是很完美。

十、引用计数的工作原理和优缺点。

原理：设置引用数，判断当前引用数是否为0.引用关系改变时修改引用数，引用数为0时立即回收。
优点：发现垃圾立即回收；最大限度减少程序暂停。
缺点：无法回收循环引用对象；时间开销大。

十一、标记整理算法的工作流程。

流程：首先遍历所有对象，对可达对象进行标记；然后进行整理，移动对象位置，让他们在地址上产生连续；最后对非活动对象进行统一清除回收。

十二、V8中新生代存储区垃圾回收流程。

流程：将新生代内存区分为两个等大小空间，使用空间为From,空闲空间为To;将活动对象存储于From空间；标记整理后将活动对象拷贝至To;From和To交换空间完成释放。

十三、增量标记算法的使用场景及工作原理。

使用场景：用于对老年代垃圾回收进行效率优化。

原理：将当前一整段垃圾回收操作分成多个部分，程序执行与垃圾回收交替执行，从而提高效率。